/** 用户信息处理函数 **/

// 导入数据库操作模块
const db = require('../db/index')
const log_db = require('../db/log')

// 导入加密模块
const bcrypt = require('bcryptjs')
// 导入jwt
const jwt = require('jsonwebtoken')
// 导入全局配置文件
const config = require('../config')

// 用户名及密码格式
const regUser = /^[a-zA-Z][a-zA-Z0-9_-]{3,9}$/
const regPassword = /^[a-zA-Z0-9_,./@#-]{5,15}$/

// 更新密码的函数
exports.updatePwd = (req,res) => {
    
    // 接收表单数据
    const userinfo = req.body
    
    // 密码格式错误 
    if(!regPassword.test(userinfo.newPwd) || !regPassword.test(userinfo.oldPwd) ){
        return res.send({ status: 1, message: '密码格式错误！' })
    }
    
    if(userinfo.newPwd == userinfo.oldPwd) return res.send({ status: 1, message: '新旧密码不能相同！' })
    
    
    // 定义根据 id 查询用户数据的 SQL 语句
    const sql = `select * from ev_users where id=?`
    
    // 执行 SQL 语句查询用户是否存在
    db.query(sql, req.user.id, (err, results) => {
      // 执行 SQL 语句失败
      if (err) return res.send({ status: 1, message: err.message })
    
      // 检查指定 id 的用户是否存在
      if (results.length !== 1) return res.send({ status: 1, message: '用户不存在！' })
    

      // 判断提交的旧密码是否正确
      const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)
      if (!compareResult) return res.send({ status: 1, message: '原密码错误！' })
    
        // 定义更新用户密码的 SQL 语句
      const sql = `update ev_users set password=? where id=?`
    
      // 对新密码进行 bcrypt 加密处理
      const newPwd = bcrypt.hashSync(req.body.newPwd, 10)
    
      // 执行 SQL 语句，根据 id 更新用户的密码
      db.query(sql, [newPwd, req.user.id], (err, results) => {
          // SQL 语句执行失败
          if (err) return res.send({ status: 1, message: err.message })
        
          // SQL 语句执行成功，但是影响行数不等于 1
          if (results.affectedRows !== 1) return res.send({ status: 1, message: ' 更新密码失败！' })
        
          // 更新密码成功
          return res.send({ status: 0, message: ' 更新密码成功！' })
      })             
        
    })
    
}

exports.getCount = (req,res) => {
    if(!regUser.test(req.user.username))    return res.send( {status:1,message: 'hacker!!!'} )
    const sql = 'SELECT COUNT(1) FROM '+ req.user.username + '_log'
    
    // 查询一共有多少条数据
    log_db.query(sql,  (err, results) => {
        // SQL 语句执行失败
        if (err) return res.send({ status: 1, message: err.message })
        
        return  res.send({ status: 0 , message: results[0]["COUNT(1)"]})
        
    })


}

exports.getLog = (req,res) => {

    // 检测用户名格式
    if(!regUser.test(req.user.username))    return res.send( {status:1,message: 'hacker!!!'} )
    const sql = `select * from ` + req.user.username + '_log order by id desc limit ' + ((req.body.page - 1)*20) + ',20'
    
    // 查询当前页的数据
    log_db.query(sql,  (err, results) => {
        // SQL 语句执行失败
        if (err) return res.send({ status: 1, message: err.message })

        // 成功 
        return  res.send({ status: 0 , message: results})

    })
}


// 获取所有告警优先级
exports.getPriority = (req,res) => {
    if(!regUser.test(req.user.username))    return res.send( {status:1,message: 'hacker!!!'} )
    const sql = "SELECT priority FROM "+ req.user.username + "_log"
    log_db.query(sql,  (err, results) => {
        // SQL 语句执行失败
        if (err) return res.send({ status: 1, message: err.message })
        let alarmCount = {'emergency':0, 'alert':0, 'critical':0, 'error':0, 'warning':0, 'notice':0, 'informational':0, 'debug':0}
        for(const res of results){
            ++alarmCount[res["priority"]]
        }
        // 成功 
        return  res.send({ status: 0 , message: alarmCount })

    })

}

// 获得用户名
exports.getUsername = (req,res) => {
    if(!regUser.test(req.user.username))    return res.send( {status:1,message: 'hacker!!!'} )
    return  res.send({ status: 0 , message: req.user.username })
}

// 删除日志
exports.deleteLog = (req,res) => {
    
    // 检测用户名格式
    if(!regUser.test(req.user.username))    return res.send( {status:1,message: 'hacker!!!'} )
    // let time = req.body.time
    // time = time.substring(0,time.length-6) + '+' + time.substring(time.length-5)

    
    // 根据id删除
    const sql = `delete from ` + req.user.username + '_log where `id`=' + "'" + req.body.id + "'" 

    log_db.query(sql,  (err, results) => {
        // SQL 语句执行失败
        if (err) return res.send({ status: 1, message: err.message })

        // SQL 语句执行成功，但影响行数不为 1
        if (results.affectedRows !== 1) {
            return res.send({ status: 1, message: '删除失败!' })
        }

        // 成功 
        return  res.send({ status: 0 , message: '删除成功!' })

    })

}

// 搜索日志
exports.searchLog = (req,res) => {
    
    // 检测用户名格式
    if(!regUser.test(req.user.username))    return res.send( {status:1,message: 'hacker!!!'} )

    // 查找
    const sql = `select * from ` + req.user.username + '_log where concat(time,priority,source,rule,rule,output,output_fields,hostname,tags) regexp "' + req.body.regex + '" order by id desc' 

    log_db.query(sql,  (err, results) => {
        // SQL 语句执行失败
        if (err) return res.send({ status: 1, message: err.message })
        
        // 页数 如果没传默认第一页
        let page = req.body.page
        if(!page)   page = 1    
        
        // 切片
        let from = Math.min((req.body.page - 1) * 20,results.length)
        let to   = Math.min( from + 19 ,results.length)
        

        // 成功 
        return  res.send({ status: 0 , message: results.slice(from,to), total:results.length})

    })

}











